package com.darksider.basemodule.base.originbase;

import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProvider;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import javax.inject.Inject;

/**
 * <pre>
 *     author : Darksiderl
 *     e-mail : 1126220529@qq.com
 *     time   : 2017/12/07
 *     desc   : 根据是否要通过Dagger注入实现Injectable接口 并且在di包内实现
 *              如果只使用 DataBinding, 则 VM 的泛型可以传 {@link ViewModel}
 *     version: 1.0
 * </pre>
 */

public abstract class OriginBaseFragment<DB extends ViewDataBinding, VM extends ViewModel>
        extends SwipeBackFragment implements IFragment {

    protected final String TAG = this.getClass().getName();

    /**
     * 是否可见，用于懒加载
     */
    protected boolean mVisible = false;
    /**
     * 是否第一次加载，用于懒加载
     */
    protected boolean mFirst = true;

    private View mRootView;

    /**
     * ViewDataBinding
     */
    protected DB mBinding;

    /**
     * MVVM ViewModel ViewModelProvider.Factory
     */
    @Inject
    protected ViewModelProvider.Factory mViewModelFactory;
    /**
     * instance in subclass; 自动销毁
     */
    protected VM mViewModel;

    public OriginBaseFragment() {
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mRootView = initView(inflater, container, savedInstanceState);
        //可见，并且是首次加载
        if (mVisible && mFirst) {
            onFragmentVisibleChange(true);
        }
        return mRootView;
    }


    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        mVisible = isVisibleToUser;
        if (mRootView == null) {
            return;
        }
        //可见，并且首次加载时才调用
        onFragmentVisibleChange(mVisible & mFirst);
    }

    /**
     * 当前 Fragment 可见状态发生变化时会回调该方法。
     * 如果当前 Fragment 是第一次加载，等待 onCreateView 后才会回调该方法，
     * 其它情况回调时机跟 {@link #setUserVisibleHint(boolean)}一致
     * 在该回调方法中你可以做一些加载数据操作，甚至是控件的操作.
     *
     * @param isVisible true  不可见 -> 可见
     *                  false 可见  -> 不可见
     */
    protected void onFragmentVisibleChange(boolean isVisible) {
    }



}
